package com.yvon.service.demo.algorithm.offer;

/**
 * 输入一个整型数组，数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
 */
public class P42 {

    public static void main(String[] args) {
        Solution solution = new P42().new Solution();
        int i = solution.maxSubArray(new int[]{1, -2, 3, -3, 2});
        System.out.printf(String.valueOf(i));
    }

    /**
     * 设 dp[i] 表示 [0..i] 中，以 nums[i] 结尾的最大子数组和，状态转移方程 dp[i] = nums[i] + max(dp[i - 1], 0)。
     *
     * 由于 dp[i] 只与子问题 dp[i-1] 有关，故可以用一个变量 f 来表示。
     */
    class Solution {
        public int maxSubArray(int[] nums) {
            int res = nums[0];
            int dp = nums[0];
            for (int i = 1; i < nums.length; i++) {
                dp = nums[i] + Math.max(dp, 0);
                res = Math.max(dp, res);
            }
            return res;
        }
    }
}
